"""
全局日志配置模块。

此模块定义了整个应用程序的日志配置，包括各种记录器、处理器、格式器和过滤器。
配置一次即可影响整个应用程序中的日志行为。

使用:
在应用程序的主入口处导入此模块以初始化日志配置。

在Python中，日志配置通常只需要在程序的主入口（主程序）中设置一次。一旦在主程序中导入并执行了`logging_config`模块，它的配置就会应用于整个应用程序，包括所有导入的模块。因此，你不需要在每个模块中单独导入`logging_config`。

只要确保在程序开始运行时（例如在`if __name__ == "__main__"`块中或在主程序的开始处）进行了日志配置，所有使用`logging`模块的地方都会遵循这一配置。这样做可以保证日志记录的一致性，而无需在每个文件中重复配置。


"""
import logging
import logging.config

# 自定义过滤器类定义...
# KeywordFilter, ErrorLevelFilter, ModuleNameFilter
class KeywordFilter(logging.Filter):
    """过滤器：仅通过包含特定关键字的日志消息"""
    def __init__(self, keyword):
        self.keyword = keyword

    def filter(self, record):
        return self.keyword in record.getMessage()

class ErrorLevelFilter(logging.Filter):
    """过滤器：仅通过ERROR级别以上的日志"""
    def filter(self, record):
        return record.levelno >= logging.ERROR

class ModuleNameFilter(logging.Filter):
    """过滤器：仅通过来自特定模块的日志"""
    def __init__(self, module_name):
        self.module_name = module_name

    def filter(self, record):
        return record.name.startswith(self.module_name)
        
LOGGING_CONFIG = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {'format': '%(name)s - %(levelname)s - %(message)s'},
        'detailed': {'format': '%(asctime)s - %(name)s - %(levelname)s: %(message)s'},
        'standard': {
            'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        },
    },
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'simple',
            'level': 'DEBUG',
            'filters': ['keyword_filter']
        },
        'file': {
            'class': 'logging.FileHandler',
            'filename': 'app.log',
            'formatter': 'detailed',
            'level': 'DEBUG',
            'filters': ['module_name_filter']
        },
        'file_logger1': {
            'class': 'logging.FileHandler',
            'filename': 'logger1.log',
            'mode': 'a',
        },
        'file_logger2': {
            'class': 'logging.FileHandler',
            'filename': 'logger2.log',
            'mode': 'a',
        },
        # 可以添加更多的处理器...
    },
    'filters': {
        'keyword_filter': {
            '()': KeywordFilter,
            'keyword': 'important'
        },
        'error_level_filter': {
            '()': ErrorLevelFilter
        },
        'module_name_filter': {
            '()': ModuleNameFilter,
            'module_name': 'specific.module'
        },
        # 可以添加更多的过滤器...
    },
    'loggers': {
        'app': {
            'handlers': ['console', 'file'],
            'level': 'DEBUG',
            'propagate': False
        },
        'app.database': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': False
        },
        'app.api': {
            'handlers': ['file'],
            'level': 'ERROR',
            'propagate': False
        },
        # 可以添加更多的记录器...
    }
}

logging.config.dictConfig(LOGGING_CONFIG)


if __name__ == "__main__":
    # 测试日志配置
    logger_database = logging.getLogger('app.database')
    logger_database.info('Testing logging configuration: app.database logger.')

    logger_api = logging.getLogger('app.api')
    logger_api.error('Testing logging configuration: app.api logger.')

